"""
LeetCode 热题

给定一个整数数组 nums，将数组中的元素向右轮转 k 个位置，其中 k 是非负数。


要解决将整数数组 nums 向右轮转 k 个位置的问题，我们可以使用以下几种方法之一：
使用额外的数组：创建一个新的数组，将每个元素放到正确的位置。
反转数组：通过三次反转数组来实现轮转。
环状替换：通过环状替换元素来实现轮转。
这里我们选择使用 反转数组 的方法，因为它的时间复杂度为 O(n)，空间复杂度为 O(1)，非常高效。
反转数组的方法
反转整个数组：将整个数组反转。
反转前 k 个元素：将反转后的前 k 个元素再反转。
反转剩余的元素：将反转后的剩余元素再反转。
"""
class Solution(object):
    def rotate(self, nums, k):
        """
        将数组中的元素向右轮转 k 个位置，其中 k 是非负数。

        参数:
        nums: List[int]，整数数组。
        k: int，轮转的步数。
        """
        if not nums:
            return

        n = len(nums)
        k = k % n  # 处理 k 大于 n 的情况

        # 反转整个数组
        self.reverse(nums, 0, n - 1)
        # 反转前 k 个元素
        self.reverse(nums, 0, k - 1)
        # 反转剩余的元素
        self.reverse(nums, k, n - 1)

    def reverse(self, nums, start, end):
        """
        反转数组 nums 从索引 start 到 end 的部分。

        参数:
        nums: List[int]，整数数组。
        start: int，起始索引。
        end: int，结束索引。
        """
        while start < end:
            nums[start], nums[end] = nums[end], nums[start]
            start += 1
            end -= 1

if __name__ == '__main__':
    a = Solution()
    nums1 = [1, 2, 3, 4, 5, 6, 7]
    a.rotate(nums1, 3)
    print(nums1)  # 输出应为 [5, 6, 7, 1, 2, 3, 4]

    nums2 = [-1, -100, 3, 99]
    a.rotate(nums2, 2)
    print(nums2)  # 输出应为 [3, 99, -1, -100]

